#ifndef CRUD_OPERATIONS_H
#define CRUD_OPERATIONS_H

#include <Poco/Data/Session.h>
#include <Poco/Data/RecordSet.h>
#include <vector>
#include <string>
#include <type_traits>

namespace servercom {

/**
 * @brief CRUD操作模板类
 */
class CrudOperations {
public:
    explicit CrudOperations(Poco::Data::Session& session);

    /**
     * @brief 创建记录
     * @param table 表名
     * @param columns 列名列表
     * @param values 值列表
     * @return 插入的行数
     */
    template <typename... Args>
    size_t create(const std::string& table, 
                 const std::vector<std::string>& columns,
                 Args&&... values);

    /**
     * @brief 查询记录
     * @param table 表名
     * @param columns 要查询的列
     * @param condition 查询条件
     * @return 查询结果记录集
     */
    Poco::Data::RecordSet read(const std::string& table,
                             const std::vector<std::string>& columns,
                             const std::string& condition = "");

    /**
     * @brief 更新记录
     * @param table 表名
     * @param updates 更新内容(列=值)
     * @param condition 更新条件
     * @return 更新的行数
     */
    size_t update(const std::string& table,
                const std::vector<std::string>& updates,
                const std::string& condition);

    /**
     * @brief 删除记录
     * @param table 表名
     * @param condition 删除条件
     * @return 删除的行数
     */
    size_t remove(const std::string& table,
                const std::string& condition);

private:
    Poco::Data::Session& session_;
};

// 模板方法实现
template <typename... Args>
size_t CrudOperations::create(const std::string& table,
                            const std::vector<std::string>& columns,
                            Args&&... values) {
    static_assert(sizeof...(Args) == columns.size(), 
                 "Number of values must match number of columns");

    std::string sql = "INSERT INTO " + table + " (";
    for (size_t i = 0; i < columns.size(); ++i) {
        sql += columns[i];
        if (i < columns.size() - 1) sql += ", ";
    }
    sql += ") VALUES (";
    for (size_t i = 0; i < columns.size(); ++i) {
        sql += "?";
        if (i < columns.size() - 1) sql += ", ";
    }
    sql += ")";

    Poco::Data::Statement insert(session_);
    insert << sql;
    (insert, ..., Poco::Data::Keywords::use(values));
    
    return insert.execute();
}

} // namespace servercom

#endif // CRUD_OPERATIONS_H